package com.ljx.springIOCTest.controller;

import com.ljx.comprehensiveCase.framework.context.ApplicationContext;
import com.ljx.comprehensiveCase.framework.context.support.ClassPathXmlApplicationContext;
import com.ljx.springIOCTest.service.UserService;


/**
 *
 * 自定义Spring IOC总结
 *
 * #### 使用到的设计模式
 * @ 工厂模式。这个使用工厂模式 + 配置文件的方式。
 * @ 单例模式。Spring IOC管理的bean对象都是单例的，此处的单例不是通过构造器进行单例的控制的，
 * 而是spring框架对每一个bean只创建了一个对象。
 * @ 模板方法模式。AbstractApplicationContext类中的finishBeanInitialization()方法调用了子类的getBean()方法，
 * 因为getBean()的实现和环境息息相关。
 * @ 迭代器模式。对于MutablePropertyValues类定义使用到了迭代器模式，因为此类存储并管理PropertyValue对象，
 * 也属于一个容器，所以给该容器提供一个遍历方式。
 *
 * 注：整个设计和Spring的设计还是有一定的出入，本案例属于简单实现（并未考虑循环依赖问题）
 * spring框架其实使用到了很多设计模式，如AOP使用到了代理模式，选择JDK代理或者CGLIB代理使用到了策略模式，
 * 还有适配器模式，装饰者模式，观察者模式等
 *
 * @作者 LJX
 * @日期 2022/12/28 10:36
 */
public class UserController {

    public static void main(String[] args) throws Exception {

        //创建spring容器对象
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        //从IOC容器获取 业务对象
        UserService userService = applicationContext.getBean("userService", UserService.class);
        //调用业务方法
        userService.addUser();

    }

}
